#ifndef _SPI_H_
#define _SPI_H_

#define SPI1_CS1 PAout(3)

/* 缓冲区说明
    1、因为SPI全双工模式,DMA要收32个字节, 必须同时写32个字节,所有有两个缓冲区
    2、当你读的时候，写缓冲区的内容也写入了SPI总线，要保证这些数据没有特定的命令
    3、最好使用写写缓冲区之后，要将缓冲区内容复位为0x00或0xFF
*/

/* dma读写 */
void spi1_dma_init();
void spi1_dma_write(uint8_t *write_buf, uint8_t len);
void spi1_dma_read_along_write(uint8_t *write_buf, uint8_t *read_buf, uint8_t len);
/* 单字节读写 */
__STATIC_FORCEINLINE void spi1_byte_write(uint8_t spi_data)
{
    (void)SPI1->DR;
    SPI1->DR = spi_data;
    while((SPI1->SR & SPI_SR_RXNE) == 0){
    }
}

__STATIC_FORCEINLINE uint8_t spi1_byte_read()
{
    (void)SPI1->DR;
    SPI1->DR = 0x00;
    while((SPI1->SR & SPI_SR_RXNE) == 0){
    }
    return SPI1->DR;
}

/* 多字节读写 */
void spi1_write(uint8_t *write_buf, uint8_t len);
void spi1_read(uint8_t *read_buf, uint8_t len);

#endif
